package com.alex.算法.数据转换;

/**
 * 描述
 * <p>
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 * <p>
 * 函数 myAtoi(string s) 的算法如下：
 * <p>
 * 空格：读入字符串并丢弃无用的前导空格（" "）
 * 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 舍入：如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被舍入为 −231 ，大于 231 − 1 的整数应该被舍入为 231 − 1 。
 * 返回整数作为最终结果。
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "42"
 * <p>
 * 输出：42
 * <p>
 * 解释：加粗的字符串为已经读入的字符，插入符号是当前读取的字符。
 * <p>
 * 带下划线线的字符是所读的内容，插入符号是当前读入位置。
 * 第 1 步："42"（当前没有读入字符，因为没有前导空格）
 * ^
 * 第 2 步："42"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）
 * ^
 * 第 3 步："42"（读入 "42"）
 * ^
 * 示例 2：
 * <p>
 * 输入：s = " -042"
 * <p>
 * 输出：-42
 * <p>
 * 解释：
 * <p>
 * 第 1 步："   -042"（读入前导空格，但忽视掉）
 * ^
 * 第 2 步："   -042"（读入 '-' 字符，所以结果应该是负数）
 * ^
 * 第 3 步："   -042"（读入 "042"，在结果中忽略前导零）
 * ^
 * 示例 3：
 * <p>
 * 输入：s = "1337c0d3"
 * <p>
 * 输出：1337
 * <p>
 * 解释：
 * <p>
 * 第 1 步："1337c0d3"（当前没有读入字符，因为没有前导空格）
 * ^
 * 第 2 步："1337c0d3"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）
 * ^
 * 第 3 步："1337c0d3"（读入 "1337"；由于下一个字符不是一个数字，所以读入停止）
 * ^
 * 示例 4：
 * <p>
 * 输入：s = "0-1"
 * <p>
 * 输出：0
 * <p>
 * 解释：
 * <p>
 * 第 1 步："0-1" (当前没有读入字符，因为没有前导空格)
 * ^
 * 第 2 步："0-1" (当前没有读入字符，因为这里不存在 '-' 或者 '+')
 * ^
 * 第 3 步："0-1" (读入 "0"；由于下一个字符不是一个数字，所以读入停止)
 * ^
 * 示例 5：
 * <p>
 * 输入：s = "words and 987"
 * <p>
 * 输出：0
 * <p>
 * 解释：
 * <p>
 * 读取在第一个非数字字符“w”处停止。
 * <p>
 * 提示：
 * <p>
 * 0 <= s.length <= 200
 * s 由英文字母（大写和小写）、数字（0-9）、' '、'+'、'-' 和 '.' 组成
 * Related Topics
 * 字符串
 */
public class 字符串转整数_8 {

    public static void main(String[] args) {
        字符串转整数_8 call = new 字符串转整数_8();
        int result = call.myAtoi("1337c0d3");
        System.out.println(result);
    }

    public int myAtoi(String str) {
        if (str == null || str == "") {
            return 0;
        }

        //去除掉前后的空格
        String strr = str.trim();
        //存储最终过滤出来的字符串
        String strrr = null;
        //字符串不为空时并且字符串不全是空白字符串时才转换
        if (strr != null && strr.isEmpty() == false) {
            char f = strr.charAt(0);
            //判断字符串中的第一个非空格字符是不是一个有效整数字符
            if (f >= '0' && f <= '9' || f == '+' || f == '-') {
                strrr = strr.substring(0, 1); // 把第一位放进去(只能是数字、正负号)
                //这时候循环只要数字，因为正负号只能出现在第一位
                for (int i = 1; i < strr.length(); i++) {
                    if (strr.charAt(i) >= '0' && strr.charAt(i) <= '9') {
                        strrr = strr.substring(0, i + 1);
                    }
                    //这是遇到不符合要求的字符，直接忽略剩余元素
                    else {
                        break;
                    }
                }
            }
        }
        //判断最终字符串是否为空或则只有一个正负号
        if (strrr == null || strrr.equals("+") || strrr.equals("-"))
            //此时strrr是String对象，如果使用==比较则比较的时内存地址
            return 0;
        //最终转换成的数字
        int num = 0;
        //使用异常机制打印结果
        try {
            num = Integer.parseInt(strrr);
        } catch (Exception e) {
            if (strrr.charAt(0) == '-')
                return Integer.MIN_VALUE;
            return Integer.MAX_VALUE;
        }

        return num;
    }
}
